package com.zxl.designpattern.creator.singleton;

/**
 * @author zxl
 * @version 1.0
 * @description 设计模式-创建型模式-饿汉式单例模式
 * @date 2025/5/31 17:56
 */
public class EagerSingleton {

    // 饿汉式单例模式
//    private static final EagerSingleton instance = new EagerSingleton();

    // 饿汉式单例模式-静态代码块
    private static final EagerSingleton instance;
    static {
        instance = new EagerSingleton();
    }

    /**
     * 构造方法私有化
     */
    private EagerSingleton(){
        // 防止反射破坏单例
        if (instance != null) {
            throw new RuntimeException("不允许通过反射创建单例实例");
        }
    }

    /**
     * 提供一个公共的静态方法，返回实例对象
     * @return
     */
    public static EagerSingleton getInstance(){
        return instance;
    }

    private void doSomething(){
        System.out.println("do something");
    }

    /**
     * 防止反序列化
     * 不反序列化时，Java 会先创建一个新的对象实例。
     * 若该对象所属类实现了readResolve()方法，就会调用这个方法。
     * readResolve()方法返回的对象会被直接返回给调用者，而新创建的对象实例则会被丢弃，不会被传递给调用者。
     * 因此，readResolve()方法可以确保反序列化后的对象与序列化前的对象是同一个对象。
     * @return
     */
    public static EagerSingleton readResolve(){
        return instance;
    }
}
